#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 300010;
const int mod = 1000000007;
vector<int>g[maxn];
LL c[2][maxn],val[2];
int n,m,L[maxn],R[maxn],d[maxn],clk;
void update(int i){
while(i < maxn){
c[0][i] += val[0];
c[1][i] += val[1];
c[0][i] %= mod;
c[1][i] %= mod;
i += i&-i;
}
}
LL query(int i){
LL sum[2] = {0},dep = d[i];
i = L[i];
while(i > 0){
sum[0] += c[0][i];
sum[1] += c[1][i];
sum[0] %= mod;
sum[1] %= mod;
i -= i&-i;
}
return ((sum[0] - dep*sum[1])%mod + mod)%mod;
}
void dfs(int u,int dep){
L[u] = ++clk;
d[u] = dep;
for(int i = g[u].size()-1; i >= 0; --i)
dfs(g[u][i],dep+1);
R[u] = clk;
}
int main(){
int u,op,x,y,z;
while(~scanf("%d",&n)){
for(int i = clk = 0; i <= n; ++i) g[i].clear();
for(int i = 2; i <= n; ++i){
scanf("%d",&u);
g[u].push_back(i);
}
dfs(1,0);
memset(c,0,sizeof c);
scanf("%d",&m);
while(m--){
scanf("%d%d",&op,&x);
if(op == 1){
scanf("%d%d",&y,&z);
val[0] = ((LL)y + (LL)d[x]*z)%mod;
val[1] = z;
update(L[x]);
val[0] = -val[0];
val[1] = -val[1];
update(R[x]+1);
}else printf("%I64d\n",query(x));
}
}
return 0;
}
445. Add Two Numbers II | 442. Find All Duplicates in an Array |
437. Path Sum III | 436. Find Right Interval |
435. Non-overlapping Intervals | 406. Queue Reconstruction by Height |
380. Insert Delete GetRandom O(1) | 332. Reconstruct Itinerary |
368. Largest Divisible Subset | 377. Combination Sum IV |
322. Coin Change | 307. Range Sum Query - Mutable |
287. Find the Duplicate Number | 279. Perfect Squares |
275. H-Index II | 274. H-Index |
260. Single Number III | 240. Search a 2D Matrix II |
238. Product of Array Except Self | 229. Majority Element II |
222. Count Complete Tree Nodes | 215. Kth Largest Element in an Array |
198. House Robber | 153. Find Minimum in Rotated Sorted Array |
150. Evaluate Reverse Polish Notation | 144. Binary Tree Preorder Traversal |
137. Single Number II | 130. Surrounded Regions |
129. Sum Root to Leaf Numbers | 120. Triangle |